package com.atguigu.day19.reference03;

import org.junit.Test;

import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier;

/*
Lambda: 简化函数式接口生成的匿名内部类
各种引用: 简化Lambda表达式
  引用的分类:
        方法引用  数组引用  构造器引用
  前提: 重写方法的方法体只有一行代码
  方法引用:
      形式:
         类名::静态方法名    重写方法的形参 与类调用静态方法的实参一一匹配
         对象名::实例方法名  重写方法的形参 与对象调用方法的实参一一匹配
         类名::实例方法名    重写的方法 只有一个形参 且 是方法的调用者
                           重写的方法 有多个形参第一个是方法的调用者 后续是方法的实参
  构造器引用:
         类名::new       重写方法的形参 与调用构造器的实参一一匹配
  数组引用:
         数组类型::new   重写方法的形参与创建数组的实参一一匹配


 */
public class OtherReference {

    @Test
    public void test03(){
     //todo 数组类型::new   重写方法的形参与创建数组的实参一一匹配

      /*  Function<Integer,int[]> f = new Function<Integer, int[]>() {
            @Override
            public int[] apply(Integer i) {
                return new int[i];
            }
        };*/
        //lambda
       // Function<Integer,int[]> f = i-> new int[i];
        //数组引用
        Function<Integer,int[]> f = int[]::new;
        Function<Integer, int[]> f1 = int[]::new;

        int[] ints = f.apply(1);
        System.out.println(Arrays.toString(ints));

        int[] array = f.apply(15);
        System.out.println("array.length = " + array.length);
        System.out.println("Arrays.toString(array) = " + Arrays.toString(array));
    }



    @Test
    public void test02(){
     //todo  类名::new       重写方法的形参 与调用构造器的实参一一匹配

        /*E e = new E() {
            @Override
            public Person getPerson(String n, int a) {
                return new Person(n,a);
            }
        };*/
        //lambda
       // E e = (n,a)-> new Person(n,a);
        //构造器引用
        E e =Person::new;


        Person person = e.getPerson("王维", 30);

        System.out.println("person = " + person);
    }

    @Test
    public void test01(){
        //todo  类名::new       重写方法的形参 与调用构造器的实参一一匹配

     /*   Supplier<Person> s = new Supplier<Person>() {
            @Override
            public Person get() {
                return new Person();
            }
        };*/
        //lambda
        //Supplier<Person> s = ()-> new Person();
        //构造器引用
        Supplier<Person> s =Person::new;


        Person person = s.get();

        System.out.println("person = " + person);

    }

}
